package ru.vsu.service;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
import ru.vsu.domain.Lot;
import ru.vsu.domain.dict.ThingType;

/**
 *  Серверный поток, следящий за аукционами и закрывающий их по мере необходимости.
 *
 * @author Roman Velichkin <vrnroman@gmail.com>
 */
@Singleton
@Startup
public class LotFinisherWatchDog implements Serializable {

    @Resource
    private TimerService timerService;

    @EJB
    private LotService lotService;

    @PostConstruct
    public void init() {
        //Этого здесь быть не должно
        lotService.createFakeThingType();
    }

    @Timeout
    public void process(Timer timer) {
        Long lotId = (Long) timer.getInfo();
        Lot lot = lotService.updateLot(lotId);
        if (lot.isSuccessful()) {
            lotService.closeLot(lot.getId());
        }
    }

    public void addNewEventForLot(Long lotId) {
        cancelEventForLot(lotId);
        createEventForLot(lotId);
    }

    private void createEventForLot(Long lotId) {
        timerService.createSingleActionTimer(LotConstants.SECONDS_WAITING_FOR_BID*1000, new TimerConfig(lotId, false));
    }


    private void cancelEventForLot(Long lotId) {
        Timer timer = getTimer(lotId);
        if (timer != null) {
            timer.cancel();
        }
    }

    private Timer getTimer(Serializable schedule) {
        Collection<Timer> timers = timerService.getTimers();

        for (Timer timer : timers) {
            if (schedule.equals(timer.getInfo())) {
                return timer;
            }
        }
	return null;
    }

}
